package rta.datos.conexion
{
	import flash.data.SQLConnection;
	import flash.data.SQLResult;
	import flash.data.SQLStatement;
	import flash.events.SQLErrorEvent;
	import flash.events.SQLEvent;
	
	import mx.collections.ArrayCollection;
	
	import rta.datos.to.Imagen;
	import rta.datos.to.ImagenSecuencia;
	import rta.datos.to.Sonido;

	public class ImagenSecuenciaDB
	{
		private var conn:SQLConnection;
		private var statement:SQLStatement;
		private var _callback:Function;
		
		public function ImagenSecuenciaDB(conn:SQLConnection)
		{
			this.conn = conn;
			statement = new SQLStatement();
			//statement.itemClass = ImagenSecuencia;
			statement.sqlConnection = conn;
			statement.addEventListener(SQLErrorEvent.ERROR, onSQLError);
		}
		
		public function set callback(value:Function):void
		{
			_callback = value;
		}
		
		
		private function onSQLError(event:SQLErrorEvent):void{
			trace(event.text);
		}
		//-------------------------------------------------
		
		
		//--OBTENER IMAGENES DE SECUENCIA-----------
		public function obtenerImagenesDeSecuencia(idSecuencia:int):void{					
			statement.text = "SELECT ims.id_imagen_secuencia idImagenSecuencia, " +
							 "ims.texto textoSecuencia, " +
							 "ims.color_texto colorSecuencia, " +
							 "i.id_imagen idImagen, " +
							 "i.nombre nombreImagen, " +
							 "i.ruta_imagen rutaImagen, " +
							 "i.texto_predefinido textoPredefinido, " +
							 "i.color_predefinido colorPredefinido, " +
							 "s.id_sonido idSonido, " +
							 "s.nombre nombreSonido, " +
							 "s.ruta_sonido rutaSonido " +
							 "FROM imagen_secuencia ims " +
							 "JOIN imagen i ON i.id_imagen = ims.id_imagen " +
							 "JOIN sonido s ON s.id_sonido = ims.id_sonido " +
							 "WHERE ims.id_secuencia = @idSecuencia " +
							 "AND ims.eliminada = false";
			statement.parameters["@idSecuencia"] = idSecuencia;
			statement.addEventListener(SQLEvent.RESULT, resultObtenerImagenesDeSecuencia);
			statement.execute();
		}
		
		private function resultObtenerImagenesDeSecuencia(event:SQLEvent):void{
			statement.removeEventListener(SQLEvent.RESULT, resultObtenerImagenesDeSecuencia);
			statement.clearParameters();
			var result:SQLResult = statement.getResult();
			var resultArray:ArrayCollection = new ArrayCollection();
			if (result != null) {  
				for each(var item:Object in result.data){
					var sonido:Sonido = new Sonido();
					sonido.id = item.idSonido;
					sonido.nombre = item.nombreSonido;
					sonido.rutaSonido = item.rutaSonido;
					
					var imagen:Imagen = new Imagen();
					imagen.id = item.idImagen;
					imagen.nombre = item.nombreImagen;
					imagen.rutaImagen = item.rutaImagen;
					imagen.textoPredefinido = item.textoPredefinido;
					imagen.colorPredefinido = item.colorPredefinido;
					
					var imagenSecuencia:ImagenSecuencia = new ImagenSecuencia();
					imagenSecuencia.id = item.idImagenSecuencia;
					imagenSecuencia.texto = item.textoSecuencia;
					imagenSecuencia.colorTexto = item.colorSecuencia;
					imagenSecuencia.imagen = imagen;
					imagenSecuencia.sonido = sonido;
					
					resultArray.addItem(imagenSecuencia);
				}
			}
			
			if(this._callback != null)
				this._callback(resultArray);
		}
		//-------------------------------------
		
		//--GUARDAR IMAGEN SECUENCIA-----------
		public function guardarImagenSecuencia(idSecuencia:int, imagenSecuencia:ImagenSecuencia):void{
			statement.text = "INSERT INTO imagen_secuencia(id_secuencia, id_imagen, id_sonido, texto, color_texto) " +
							 "VALUES (@idSecuencia, @idImagen, @idSonido, @texto, @color)";
			statement.addEventListener(SQLEvent.RESULT, resultGuardarImagenSecuencia);
			statement.parameters["@idSecuencia"] = idSecuencia;
			statement.parameters["@idImagen"] = imagenSecuencia.imagen.id;
			statement.parameters["@idSonido"] = imagenSecuencia.sonido.id;
			statement.parameters["@texto"] = imagenSecuencia.texto;
			statement.parameters["@color"] = imagenSecuencia.colorTexto;
			statement.execute();
		}
		
		private function resultGuardarImagenSecuencia(event:SQLEvent):void{
			statement.removeEventListener(SQLEvent.RESULT, resultGuardarImagenSecuencia);
			statement.clearParameters();
			
			if (this._callback != null) {  
				this._callback();
			}
		}
		//-------------------------------------
		
		//--EDITAR IMAGEN SECUENCIA-----------
		public function editarImagenSecuencia(imagenSecuencia:ImagenSecuencia):void{
			statement.text = "UPDATE imagen_secuencia " +
							 "SET id_imagen = @idImagen, id_sonido = @idSonido, texto = @texto, color_texto = @color " +
							 "WHERE id_imagen_secuencia = @id_imagen_secuencia";
			statement.addEventListener(SQLEvent.RESULT, resultEditarImagenSecuencia);
			statement.parameters["@id_imagen_secuencia"] = imagenSecuencia.id;
			statement.parameters["@idImagen"] = imagenSecuencia.imagen.id;
			statement.parameters["@idSonido"] = imagenSecuencia.sonido.id;
			statement.parameters["@texto"] = imagenSecuencia.texto;
			statement.parameters["@color"] = imagenSecuencia.colorTexto;
			statement.execute();
		}
		
		private function resultEditarImagenSecuencia(event:SQLEvent):void{
			statement.removeEventListener(SQLEvent.RESULT, resultEditarImagenSecuencia);
			statement.clearParameters();
			
			if (this._callback != null) {  
				this._callback();
			}
		}
		//-------------------------------------
		
		//--ELIMINAR IMAGEN SECUENCIA-----------
		private var imagenSecAEliminar:ImagenSecuencia;
		public function eliminarImagenSecuencia(imagenSecuencia:ImagenSecuencia):void{
			imagenSecAEliminar = imagenSecuencia;
			
			statement.text = "SELECT * FROM imagen_reproducida WHERE id_imagen_secuencia = @id_imagen_secuencia";
			statement.parameters["@id_imagen_secuencia"] = imagenSecuencia.id;
			statement.addEventListener(SQLEvent.RESULT, resultConsultaImagenReproducida);
			statement.execute();
		}
		
		private function resultConsultaImagenReproducida(event:SQLEvent):void{
			statement.removeEventListener(SQLEvent.RESULT, resultConsultaImagenReproducida);
			statement.clearParameters();
			
			var result:SQLResult = statement.getResult();
			if(result){
				if(result.data && result.data.length > 0){
					//Imagen ya fue reproducida, eliminación LOGICA
					statement.text = "UPDATE imagen_secuencia " +
									 "SET eliminada = true " +
									 "WHERE id_imagen_secuencia = @id_imagen_secuencia";	
				}
				else{     
					//Imagen no ha sido reproducida, eliminación FISICA
					statement.text = "DELETE FROM imagen_secuencia " +
									 "WHERE id_imagen_secuencia = @id_imagen_secuencia";
				}
				
				statement.parameters["@id_imagen_secuencia"] = imagenSecAEliminar.id;
				statement.addEventListener(SQLEvent.RESULT, resultEliminarImagenSecuencia);
				statement.execute();
			}
		}
		
		private function resultEliminarImagenSecuencia(event:SQLEvent):void{
			statement.removeEventListener(SQLEvent.RESULT, resultEliminarImagenSecuencia);
			statement.clearParameters();
			
			if (this._callback != null) {  
				this._callback();
			}
		}
		//-------------------------------------
		
		//--GUARDAR REPETICIONES DE IMAGEN EN SESION
		public function guardarRepeticiones(idSesion:int, imagenSecuencia:ImagenSecuencia):void{
			statement.text = "INSERT INTO imagen_reproducida(id_sesion, id_imagen_secuencia, repeticiones) " +
							 "VALUES ("+ idSesion + ", " + imagenSecuencia.id + ", " + imagenSecuencia.repeticiones + ")";	
			statement.execute();
		}
	}
}